home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / a_utils / perl / perl5a1.lha / perl5alpha1 / do / sopt < prev    next >
Encoding:
Text File  |  1992-08-15  |  998 b   |  52 lines

  1. int
  2. do_sopt(optype, stab, arglast)
  3. int optype;
  4. STAB *stab;
  5. int *arglast;
  6. {
  7.     register STR **st = stack->ary_array;
  8.     register int sp = arglast[1];
  9.     register STIO *stio;
  10.     int fd;
  11.     unsigned int lvl;
  12.     unsigned int optname;
  13.  
  14.     if (!stab)
  15.     goto nuts;
  16.  
  17.     stio = stab_io(stab);
  18.     if (!stio || !stio->ifp)
  19.     goto nuts;
  20.  
  21.     fd = fileno(stio->ifp);
  22.     lvl = (unsigned int)str_gnum(st[sp+1]);
  23.     optname = (unsigned int)str_gnum(st[sp+2]);
  24.     switch (optype) {
  25.     case O_GSOCKOPT:
  26.     st[sp] = str_2mortal(Str_new(22,257));
  27.     st[sp]->str_cur = 256;
  28.     st[sp]->str_pok = 1;
  29.     if (getsockopt(fd, lvl, optname, st[sp]->str_ptr,
  30.             (int*)&st[sp]->str_cur) < 0)
  31.         goto nuts;
  32.     break;
  33.     case O_SSOCKOPT:
  34.     st[sp] = st[sp+3];
  35.     if (setsockopt(fd, lvl, optname, st[sp]->str_ptr, st[sp]->str_cur) < 0)
  36.         goto nuts;
  37.     st[sp] = &str_yes;
  38.     break;
  39.     }
  40.     
  41.     return sp;
  42.  
  43. nuts:
  44.     if (dowarn)
  45.     warn("[gs]etsockopt() on closed fd");
  46.     st[sp] = &str_undef;
  47.     errno = EBADF;
  48.     return sp;
  49.  
  50. }
  51.  
  52.